From b02023ee414fffe6ef84213b9fe2f87610bd5e38 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 17 Dec 2016 12:07:37 +0300 Subject: [PATCH] Add source_id method to the Source --- src/cargo/core/registry.rs | 20 +++++++++++--------- src/cargo/core/source.rs | 11 +++++++++-- src/cargo/ops/resolve.rs | 12 +++++------- src/cargo/sources/directory.rs | 12 +++++++----- src/cargo/sources/git/source.rs | 4 ++++ src/cargo/sources/path.rs | 13 ++++++++----- src/cargo/sources/registry/mod.rs | 4 ++++ src/cargo/sources/replaced.rs | 4 ++++ 8 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/cargo/core/registry.rs b/src/cargo/core/registry.rs index ec458f8fb..ff4a6219d 100644 --- a/src/cargo/core/registry.rs +++ b/src/cargo/core/registry.rs @@ -149,19 +149,20 @@ impl<'cfg> PackageRegistry<'cfg> { Ok(()) } - pub fn add_preloaded(&mut self, id: &SourceId, source: Box) { - self.add_source(id, source, Kind::Locked); + pub fn add_preloaded(&mut self, source: Box) { + self.add_source(source, Kind::Locked); } - fn add_source(&mut self, id: &SourceId, source: Box, + fn add_source(&mut self, source: Box, kind: Kind) { - self.sources.insert(id, source); - self.source_ids.insert(id.clone(), (id.clone(), kind)); + let id = source.source_id().clone(); + self.sources.insert(source); + self.source_ids.insert(id.clone(), (id, kind)); } - pub fn add_override(&mut self, id: &SourceId, source: Box) { - self.add_source(id, source, Kind::Override); - self.overrides.push(id.clone()); + pub fn add_override(&mut self, source: Box) { + self.overrides.push(source.source_id().clone()); + self.add_source(source, Kind::Override); } pub fn register_lock(&mut self, id: PackageId, deps: Vec) { @@ -179,11 +180,12 @@ impl<'cfg> PackageRegistry<'cfg> { fn load(&mut self, source_id: &SourceId, kind: Kind) -> CargoResult<()> { (|| { let source = self.source_config.load(source_id)?; + assert_eq!(source.source_id(), source_id); if kind == Kind::Override { self.overrides.push(source_id.clone()); } - self.add_source(source_id, source, kind); + self.add_source(source, kind); // Ensure the source has fetched all necessary remote data. let _p = profile::start(format!("updating: {}", source_id)); diff --git a/src/cargo/core/source.rs b/src/cargo/core/source.rs index 91d2acff7..dc334535f 100644 --- a/src/cargo/core/source.rs +++ b/src/cargo/core/source.rs @@ -20,6 +20,8 @@ use util::{human, Config, CargoResult, ToUrl}; /// A Source finds and downloads remote packages based on names and /// versions. pub trait Source: Registry { + fn source_id(&self) -> &SourceId; + /// The update method performs any network operations required to /// get the entire list of all names, versions and dependencies of /// packages managed by the Source. @@ -53,6 +55,10 @@ pub trait Source: Registry { } impl<'a, T: Source + ?Sized + 'a> Source for Box { + fn source_id(&self) -> &SourceId { + (**self).source_id() + } + fn update(&mut self) -> CargoResult<()> { (**self).update() } @@ -505,8 +511,9 @@ impl<'src> SourceMap<'src> { self.get(pkg_id.source_id()) } - pub fn insert(&mut self, id: &SourceId, source: Box) { - self.map.insert(id.clone(), source); + pub fn insert(&mut self, source: Box) { + let id = source.source_id().clone(); + self.map.insert(id, source); } pub fn is_empty(&self) -> bool { diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index b1f33a2d2..76e5e2a0e 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -34,13 +34,11 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>, let mut registry = PackageRegistry::new(ws.config())?; - let mut write_lockfile = true; + // Avoid writing a lockfile if we are `cargo install`ing a non local package. + let write_lockfile = source.is_none() || ws.current_opt().is_none(); + if let Some(source) = source { - if let Some(root_package) = ws.current_opt() { - // Avoid writing a lockfile if we are `cargo install`ing a non local package. - write_lockfile = false; - registry.add_preloaded(root_package.package_id().source_id(), source); - } + registry.add_preloaded(source); } // First, resolve the root_package's *listed* dependencies, as well as @@ -265,7 +263,7 @@ fn add_overrides<'a>(registry: &mut PackageRegistry<'a>, (defined in `{}`)", path.display(), definition.display())) })?; - registry.add_override(&id, Box::new(source)); + registry.add_override(Box::new(source)); } Ok(()) } diff --git a/src/cargo/sources/directory.rs b/src/cargo/sources/directory.rs index fc7abf56c..96d06a8be 100644 --- a/src/cargo/sources/directory.rs +++ b/src/cargo/sources/directory.rs @@ -13,7 +13,7 @@ use util::{CargoResult, human, ChainError, Config, Sha256}; use util::paths; pub struct DirectorySource<'cfg> { - id: SourceId, + source_id: SourceId, root: PathBuf, packages: HashMap, config: &'cfg Config, @@ -29,7 +29,7 @@ impl<'cfg> DirectorySource<'cfg> { pub fn new(path: &Path, id: &SourceId, config: &'cfg Config) -> DirectorySource<'cfg> { DirectorySource { - id: id.clone(), + source_id: id.clone(), root: path.to_path_buf(), config: config, packages: HashMap::new(), @@ -57,6 +57,10 @@ impl<'cfg> Registry for DirectorySource<'cfg> { } impl<'cfg> Source for DirectorySource<'cfg> { + fn source_id(&self) -> &SourceId { + &self.source_id + } + fn update(&mut self) -> CargoResult<()> { self.packages.clear(); let entries = self.root.read_dir().chain_error(|| { @@ -67,9 +71,7 @@ impl<'cfg> Source for DirectorySource<'cfg> { for entry in entries { let entry = entry?; let path = entry.path(); - let mut src = PathSource::new(&path, - &self.id, - self.config); + let mut src = PathSource::new(&path, &self.source_id, self.config); src.update()?; let pkg = src.root_package()?; diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 0587d185f..eb0725ce9 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -122,6 +122,10 @@ impl<'cfg> Registry for GitSource<'cfg> { } impl<'cfg> Source for GitSource<'cfg> { + fn source_id(&self) -> &SourceId { + &self.source_id + } + fn update(&mut self) -> CargoResult<()> { let lock = self.config.git_path() .open_rw(".cargo-lock-git", self.config, "the git checkouts")?; diff --git a/src/cargo/sources/path.rs b/src/cargo/sources/path.rs index 18e6e35da..035474b8a 100644 --- a/src/cargo/sources/path.rs +++ b/src/cargo/sources/path.rs @@ -12,7 +12,7 @@ use util::{self, CargoResult, internal, internal_error, human, ChainError}; use util::Config; pub struct PathSource<'cfg> { - id: SourceId, + source_id: SourceId, path: PathBuf, updated: bool, packages: Vec, @@ -28,7 +28,7 @@ impl<'cfg> PathSource<'cfg> { pub fn new(path: &Path, id: &SourceId, config: &'cfg Config) -> PathSource<'cfg> { PathSource { - id: id.clone(), + source_id: id.clone(), path: path.to_path_buf(), updated: false, packages: Vec::new(), @@ -68,11 +68,10 @@ impl<'cfg> PathSource<'cfg> { if self.updated { Ok(self.packages.clone()) } else if self.recursive { - ops::read_packages(&self.path, &self.id, self.config) + ops::read_packages(&self.path, &self.source_id, self.config) } else { let path = self.path.join("Cargo.toml"); - let (pkg, _) = ops::read_package(&path, &self.id, - self.config)?; + let (pkg, _) = ops::read_package(&path, &self.source_id, self.config)?; Ok(vec![pkg]) } } @@ -324,6 +323,10 @@ impl<'cfg> Registry for PathSource<'cfg> { } impl<'cfg> Source for PathSource<'cfg> { + fn source_id(&self) -> &SourceId { + &self.source_id + } + fn update(&mut self) -> CargoResult<()> { if !self.updated { let packages = self.read_packages()?; diff --git a/src/cargo/sources/registry/mod.rs b/src/cargo/sources/registry/mod.rs index dd5056be9..0f188a008 100644 --- a/src/cargo/sources/registry/mod.rs +++ b/src/cargo/sources/registry/mod.rs @@ -337,6 +337,10 @@ impl<'cfg> Registry for RegistrySource<'cfg> { } impl<'cfg> Source for RegistrySource<'cfg> { + fn source_id(&self) -> &SourceId { + &self.source_id + } + fn update(&mut self) -> CargoResult<()> { // If we have an imprecise version then we don't know what we're going // to look for, so we always attempt to perform an update here. diff --git a/src/cargo/sources/replaced.rs b/src/cargo/sources/replaced.rs index e164a1c7c..ddf2085eb 100644 --- a/src/cargo/sources/replaced.rs +++ b/src/cargo/sources/replaced.rs @@ -33,6 +33,10 @@ impl<'cfg> Registry for ReplacedSource<'cfg> { } impl<'cfg> Source for ReplacedSource<'cfg> { + fn source_id(&self) -> &SourceId { + &self.to_replace + } + fn update(&mut self) -> CargoResult<()> { self.inner.update().chain_error(|| { human(format!("failed to update replaced source `{}`", -- 2.30.2